package com.ppc.config;

import com.ppc.constant.CompanyConstant;
import com.ppc.interceptor.JwtTokenAdminInterceptor;
import com.ppc.interceptor.JwtTokenEmployerInterceptor;
import com.ppc.interceptor.JwtTokenWorkerInterceptor;
import com.ppc.json.JacksonObjectMapper;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

/**
 * 配置类，注册web层相关组件
 *
 * @author jianKangS1
 * @date 2023/12/20
 */
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {


  @Autowired
  private JwtTokenAdminInterceptor jwtTokenAdminInterceptor;

  @Autowired
  private JwtTokenEmployerInterceptor jwtTokenEmployerInterceptor;

  @Autowired
  private JwtTokenWorkerInterceptor jwtTokenWorkerInterceptor;

  /**
   * 注册自定义拦截器
   *
   * @param registry
   */
  protected void addInterceptors(InterceptorRegistry registry) {
    log.info("开始注册自定义拦截器...");
    registry.addInterceptor(jwtTokenAdminInterceptor)
        .addPathPatterns("/admin/**")
        .excludePathPatterns("/admin/login")
        .excludePathPatterns("/admin/register");

    registry.addInterceptor(jwtTokenEmployerInterceptor)
        .addPathPatterns("/employer/**")
        .excludePathPatterns("/employer/login")
        .excludePathPatterns("/employer/login_verify");

    registry.addInterceptor(jwtTokenWorkerInterceptor)
        .addPathPatterns("/worker/**")
        .excludePathPatterns("/worker/login")
        .excludePathPatterns("/worker/login_verify");

  }

  /**
   * 通过knife4j生成接口文档
   *
   * @return
   */
  @Bean
  public Docket docket() {
    ApiInfo apiInfo = new ApiInfoBuilder()
        .title(CompanyConstant.COMPANY_NAME + "接口文档")
        .version("2.0")
        .description(CompanyConstant.COMPANY_NAME + "接口文档")
        .build();
    Docket docket = new Docket(DocumentationType.SWAGGER_2)
        .apiInfo(apiInfo)
        .select()
        .apis(RequestHandlerSelectors.basePackage("com.ppc.controller"))
        .paths(PathSelectors.any())
        .build();
    return docket;
  }

  /**
   * 设置静态资源映射
   *
   * @param registry
   */
  protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
    registry.addResourceHandler("/webjars/**")
        .addResourceLocations("classpath:/META-INF/resources/webjars/");
  }

  //扩展spring mvc消息转换器，主要对时间进行格式转换
  @Override
  protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    log.info("扩展消息转换器");
    //创建消息转换器对象
    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();

    mappingJackson2HttpMessageConverter.setObjectMapper(new JacksonObjectMapper());

    converters.add(0, mappingJackson2HttpMessageConverter);


  }
}
